<?php

namespace app\index\controller;

use think\Controller;
use think\Db;
use think\Request;
use extend\REST;
use extend\Smtp;
use think\Session;
use app\index\validate\updateValidate;

class Index extends Controller
{

    /**首页
     * @return string
     */
    public function index()
    {
        return '<h1>这里是首页!</h1>';
    }

    /**登录
     * @return \think\response\View
     */
    public function login()
    {
        $token = $this->request->token('__token__', 'sha1');
        Session::set('token', [
            'token' => $token
        ]);

        return view('login/index', [
                'token' => $token,]
        );
    }

    /**
     *手机 注册页面
     * @return \think\response\View
     */
    public function register()
    {
        return view('login/register');
    }

    /**
     * 执行注册
     *
     */
    public function doregister(Request $request)
    {
        $post = $request->post();
        if (empty($_POST['tel']) || empty($_POST['pwd']) || empty($_POST['rpwd']) || empty($_POST['yz'])) {
            return $this->error('不能为空');
        }
        if ($a = strlen($post['tel']) !== 11) {
            return $this->error('手机号码有误');
        }
        $onlyTel = $this->findTel($_POST['tel']);
        if ($onlyTel !== null) {
//            dump($onlyTel);die;
            return $this->error('手机号码重复');
        }
        if ($post['pwd'] !== $post['rpwd']) {
            return $this->error('两次密码不一致');
        }
        $session_code = Session::get('code');
        if ($post['code'] !== $session_code) {
            return $this->error('验证码不对');
        }
        $data = [
            'tel' => $post['tel'],
            'pwd' => md5($post['rpwd']),

        ];
//        dump($post);
//        die;


        $rows = Db::name('user')
            ->insert($data);
        if ($rows == 1) {
            return $this->success('注册成功', url('index/index/index'));
        }
    }


    /**
     * tel重复查询
     * @param $tel
     * @return array|false|\PDOStatement|string|\think\Model
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function findTel($tel)
    {
        $rows = Db::name('user')
            ->where('tel', $tel)
            ->find();
        return $rows;
    }


    /**邮箱注册
     * @return \think\response\View
     */
    public function email()
    {

        return view('login/email');
    }

    /**短信验证
     * @param $tel
     * @return bool|\extend\stdClass|mixed|\SimpleXMLElement
     */
    public function send($tel)
    {
        $data = [
            'codenum' => '1'
        ];
        //查找数据库有没有这个tel(接受验证码的手机  有就update  没有就add
        $issetTel = $this->issetTel($tel);
        if ($issetTel == null) {
            $res = Db::name('tel_code')
                ->where('tel', $tel)
                ->insert($data);
        } else {
            $codenum['codenum'] = $this->getUserCodeNum($tel);
            if ($codenum['codenum']['codenum'] == 5) {
                //验证码字数到5  add  限制时间为当前时间
                //第二天发短信 检测当前时间 >=  time +24h    若>则 清空 次数
                $time = [
                    'time' => time()
                ];
                Db::name('tel_code')
                    ->where('tel', $tel)
                    ->update($time);
                return $this->error('当日验证码次数超过限制!!!');
            }
            $res = Db::name('tel_code')
                ->where('tel', $tel)
                ->setInc('codenum');
        }

        //每次发送验证码之前 查询tel_code time 时间 为 空  直接发送
//        有 time 则  time+24h  >=  time()当前时间   发送    否则 限制时间未到 不发
        $teltime = Db::name('tel_code')
            ->where('tel', $tel)
            ->find('codenum');
        dump($teltime);
        if ($teltime == '') {
            //  验证码  一会用于验证
            $yzm = mt_rand(1000, 9999);
            Session::set('code', $yzm);
            $data2 = [$yzm, 10];
            $result = $this->sendSMS($tel, $data2, 1);
            return $result;

        }
        $newtime = time() + 60 * 60 * 24;
        if ($teltime >= $newtime) {
            //24h限制过期 直接清空
            $ptime = [
                'codenum' => '',
            ];
            Db::name('tel_code')
                ->where('tel', $tel)
                ->update($ptime);

            //  验证码  一会用于验证
            $yzm = mt_rand(1000, 9999);
            Session::set('code', $yzm);
            $data2 = [$yzm, 10];
            $result = $this->sendSMS($tel, $data2, 1);
            return $result;
        }
    }

    /***
     * 数据库 零时的验证码表 是否有tel 存在
     * @param $tel
     * @return array|false|\PDOStatement|string|\think\Model
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    function issetTel($tel)
    {
        $rows = Db::name('tel_code')
            ->where('tel', $tel)
            ->find();
        return $rows;
    }


    /**
     * 获取该用户 今日发送验证码次数
     * @param $tel
     * @return array|false|\PDOStatement|string|\think\Model
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    function getUserCodeNum($tel)
    {
        $rows = Db::name('tel_code')
            ->field('codenum')
            ->where('tel', $tel)
            ->find();
        return $rows;
    }


    /**
     * 发送模板短信
     * @param to 手机号码集合,用英文逗号分开
     * @param datas 内容数据 格式为数组 例如：array('Marry','Alon')，如不需替换请填 null
     * @param $tempId 模板Id, 默认用 id = 1
     */
    function sendSMS($to, $datas, $tempId)
    {
        // 初始化REST SDK
        $rest = new REST('app.cloopen.com', '8883', '2013-12-26');
        $rest->setAccount('8a216da86a58af8b016a8d0a72981bf0', '82ffeebed9bd43998c0429aebe68c8d3');
        $rest->setAppId('8a216da86a58af8b016a8d0a72eb1bf7');
        // 发送模板短信
        $result = $rest->sendTemplateSMS($to, $datas, 1);
        if ($result == NULL) {
            return false;
        }
        return $result;
//        if ($result->statusCode != 0) {
//            //TODO 添加错误处理逻辑
//            return $result;
//        } else {
//            //TODO 添加成功处理逻辑
//            return $result;
//        }
    }

    /**执行登录
     * @param $tel
     * @param $pwd
     */
    public function dologin(Request $request)
    {
// 接受登录数据
        $data = $request->post();
        //加密密码
        $data['pwd'] = md5($data['pwd']);
//        dump($data);die;
        //如果输入中包含@,则使用邮箱登录验证
        if (preg_match('/^.*@.*$/', $data['name']) == 1) {
            $data['email'] = $data['name'];
            $result = $this->findUserByEmail($data);
            //如果输入中为11个数字, 使用手机登录验证
        } else if (preg_match('/^\d{11}$/', $data['name']) == 1) {
            $data['tel'] = $data['name'];
            $result = $this->findUserByTel($data);
            //否则, 使用用户名登录验证
        }
        $session_token = Session::get()['token']['token'];
        if ($session_token !== $data['__token__']) {
            return $this->error('登录失败请重试');
        }

//        // 引入验证器
//        $vali = new updateValidate();
//        $result = $vali->goCheck($data);


        if ($result > 0) {
            $this->success('登录成功');
        }
        $this->error('账号不存在');
    }

    public function findUserByEmail($data)
    {
        $result = Db::name('user')
            ->where(['email' => $data['email'], 'pwd' => $data['pwd']])
            ->find();
        return $result;
    }

    public function findUserByTel($data)
    {
        $result = Db::name('user')
            ->where(['tel' => $data['tel'], 'pwd' => $data['pwd']])
            ->find();
        return $result;
    }


    /**
     * 邮箱执行注册
     */
    public function sendmail($email)
    {
        $emailCode = mt_rand(1000, 9999);
        Session::set('emailCode', $emailCode);

        $smtpserver = "smtp.qq.com";//SMTP服务器
        $smtpserverport = 25;//SMTP服务器端口
        $smtpusermail = "765229854@qq.com";//SMTP服务器的用户邮箱
        $smtpemailto = $email;//发送给谁
        $smtpuser = "765229854@qq.com";//SMTP服务器的用户帐号，注：部分邮箱只需@前面的用户名
        $smtppass = "blmaasosbiltbche";//SMTP服务器的授权码
        $mailtitle = '我是邮件demo';//邮件主题
        $mailcontent = $emailCode;//邮件内容
        $mailtype = "HTML";//邮件格式（HTML/TXT）,TXT为文本邮件
        //************************ 配置信息 ****************************
        $smtp = new Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.
        $smtp->debug = false;//是否显示发送的调试信息
        $state = $smtp->sendmail($smtpemailto, $smtpusermail, $mailtitle, $mailcontent, $mailtype);
        if ($state == "") {
            return false;
        }
        return '1';


    }

    /**执行邮箱注册
     * @param $tel
     * @param $pwd
     */
    public function doemail(Request $request)
    {
        $post = $request->post();
        $session_emailCode = Session::get('emailCode');
        if (intval($post['emailCode']) !== $session_emailCode) {
            return $this->error('验证码不对');
        }
        if ($post['pwd'] !== $post['rpwd']) {
            return $this->error('两次密码不一致');
        }
        if (empty($_POST['email']) || empty($_POST['pwd']) || empty($_POST['rpwd']) || empty($_POST['emailCode'])) {
            return $this->error('不能为空');
        }
        $onlyemail = $this->findEmail($_POST['email']);
        if ($onlyemail !== null) {
//            dump($onlyTel);die;
            return $this->error('邮箱重复');
        }
        $data = [
            'email' => $post['email'],
            'pwd' => md5($post['rpwd'])
        ];
//        dump($post);
//        die;
        $rows = Db::name('user')
            ->insert($data);
        if ($rows == 1) {
            return $this->success('注册成功', url('index/index/index'));
        }

    }

    /**找重复的email
     * @param $email
     * @return array|false|\PDOStatement|string|\think\Model
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function findEmail($email)
    {
        $rows = Db::name('user')
            ->where('email', $email)
            ->find();
        return $rows;
    }
}

